<template>
  <div class="my-scene-box" ref="mySceneBox"></div>
</template>

<script>
// 导入整个 three.js核心库
import * as THREE from "three";

export default {
  name: "demoOne",
  data() {
    return {
      scene: null,
      mesh: null,
      renderer: null,
    };
  },
  mounted() {
    this.initThree();
  },
  methods: {
    initThree() {
      // 1.创建场景对象Scene
      this.scene = new THREE.Scene();
      // 2.创建网格模型
      // var geometry = new THREE.SphereGeometry(60, 40, 40); //创建一个球体几何对象
      var geometry = new THREE.BoxGeometry(100, 100, 100); //创建一个立方体几何对象Geometry
      var material = new THREE.MeshLambertMaterial({
        color: 0x0000ff,
      }); //材质对象Material
      this.mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh
      this.scene.add(this.mesh); //网格模型添加到场景中

      // 3.光源设置-点光源
      var point = new THREE.PointLight(0xffffff);
      point.position.set(400, 200, 300); //点光源位置
      this.scene.add(point); //点光源添加到场景中
      // 4.环境光
      var ambient = new THREE.AmbientLight(0x444444);
      this.scene.add(ambient);

      // 5.相机设置
      var width = this.$refs.mySceneBox.clientWidth; //窗口宽度
      var height = this.$refs.mySceneBox.clientHeight; //窗口高度
      var k = width / height; //窗口宽高比
      var s = 200; //三维场景显示范围控制系数，系数越大，显示的范围越大
      //创建相机对象
      this.camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000);
      this.camera.position.set(200, 300, 200); //设置相机位置
      this.camera.lookAt(this.scene.position); //设置相机方向(指向的场景对象)
      // 6.创建渲染器对象
      this.renderer = new THREE.WebGLRenderer();
      this.renderer.setSize(width, height); //设置渲染区域尺寸
      this.renderer.setClearColor(0xb9d3ff, 1); //设置背景颜色

      this.$refs.mySceneBox.appendChild(this.renderer.domElement); //body元素中插入canvas对象
      //执行渲染操作   指定场景、相机作为参数

      // 持续渲染
      this.loopRender();
    },
    loopRender() {
      // 默认是 60px
      requestAnimationFrame(this.loopRender);
      this.renderer.render(this.scene, this.camera); //执行渲染操作
      this.mesh.rotateY(0.01); //旋转角速度0.001弧度每毫秒
    },
  },
};
</script>
<style>
.my-scene-box {
  width: 90%;
  height: 500px;
  margin: 0 auto;
  border: 1px solid #000;
}
</style>
